﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;

public partial class Summary : WebPageBase
{

    public UserQ User()
    {
        int userId = String.IsNullOrEmpty(HiddenFieldUserId.Value) ? 0 : int.Parse(HiddenFieldUserId.Value);
        UserQ user = base.db.UserQs.First(u => u.Id == userId);
        return user;
    }
    public int Year()
    {
        return String.IsNullOrEmpty(HiddenFieldYear.Value) ? 0 : int.Parse(HiddenFieldYear.Value);
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            int id = 0;
            if (Request["Id"] != null)
            {
                id = int.Parse(Request["Id"].ToString());
            }
            else
            {
                id = base.UserSystem.Id;
            }
            HiddenFieldUserId.Value = id.ToString();
            HiddenFieldYear.Value = DateTime.Now.Year.ToString();
            ButtonUpdateObjective.Visible = (base.UserSystem.RoleId == 1);
            LoadObjective();
            LoadData();
            
        }
    }

    public void LoadData()
    {
        LiteralTexts(1, LiteralObjetivoEne, LiteralAlcanceEne, LiteralAlcancePorcentajeEne, LiteralPromedioDiarioEne, LiteralProyeccionEne, LiteralAlcanceProyectadoEne,
                         LiteralEntrevistadoEne, LiteralPasoEne, LiteralNoPasoEne, LiteralContratadoEne, LiteralCapacitadoEne, LiteralNoCapacitadoEne);

        LiteralTexts(2, LiteralObjetivoFeb, LiteralAlcanceFeb, LiteralAlcancePorcentajeFeb, LiteralPromedioDiarioFeb, LiteralProyeccionFeb, LiteralAlcanceProyectadoFeb,
                     LiteralEntrevistadoFeb, LiteralPasoFeb, LiteralNoPasoFeb, LiteralContratadoFeb, LiteralCapacitadoFeb, LiteralNoCapacitadoFeb);

        LiteralTexts(3, LiteralObjetivoMar, LiteralAlcanceMar, LiteralAlcancePorcentajeMar, LiteralPromedioDiarioMar, LiteralProyeccionMar, LiteralAlcanceProyectadoMar,
                     LiteralEntrevistadoMar, LiteralPasoMar, LiteralNoPasoMar, LiteralContratadoMar, LiteralCapacitadoMar, LiteralNoCapacitadoMar);

            LiteralTexts(4, LiteralObjetivoAbr, LiteralAlcanceAbr, LiteralAlcancePorcentajeAbr, LiteralPromedioDiarioAbr, LiteralProyeccionAbr, LiteralAlcanceProyectadoAbr,
                     LiteralEntrevistadoAbr, LiteralPasoAbr, LiteralNoPasoAbr, LiteralContratadoAbr, LiteralCapacitadoAbr, LiteralNoCapacitadoAbr);

        LiteralTexts(5, LiteralObjetivoMay, LiteralAlcanceMay, LiteralAlcancePorcentajeMay, LiteralPromedioDiarioMay, LiteralProyeccionMay, LiteralAlcanceProyectadoMay,
                     LiteralEntrevistadoMay, LiteralPasoMay, LiteralNoPasoMay, LiteralContratadoMay, LiteralCapacitadoMay, LiteralNoCapacitadoMay);

        LiteralTexts(6, LiteralObjetivoJun, LiteralAlcanceJun, LiteralAlcancePorcentajeJun, LiteralPromedioDiarioJun, LiteralProyeccionJun, LiteralAlcanceProyectadoJun,
                     LiteralEntrevistadoJun, LiteralPasoJun, LiteralNoPasoJun, LiteralContratadoJun, LiteralCapacitadoJun, LiteralNoCapacitadoJun);

        LiteralTexts(7, LiteralObjetivoJul, LiteralAlcanceJul, LiteralAlcancePorcentajeJul, LiteralPromedioDiarioJul, LiteralProyeccionJul, LiteralAlcanceProyectadoJul,
                     LiteralEntrevistadoJul, LiteralPasoJul, LiteralNoPasoJul, LiteralContratadoJul, LiteralCapacitadoJul, LiteralNoCapacitadoJul);

        LiteralTexts(8, LiteralObjetivoAgo, LiteralAlcanceAgo, LiteralAlcancePorcentajeAgo, LiteralPromedioDiarioAgo, LiteralProyeccionAgo, LiteralAlcanceProyectadoAgo,
                     LiteralEntrevistadoAgo, LiteralPasoAgo, LiteralNoPasoAgo, LiteralContratadoAgo, LiteralCapacitadoAgo, LiteralNoCapacitadoAgo);

        LiteralTexts(9, LiteralObjetivoSep, LiteralAlcanceSep, LiteralAlcancePorcentajeSep, LiteralPromedioDiarioSep, LiteralProyeccionSep, LiteralAlcanceProyectadoSep,
                     LiteralEntrevistadoSep, LiteralPasoSep, LiteralNoPasoSep, LiteralContratadoSep, LiteralCapacitadoSep, LiteralNoCapacitadoSep);

        LiteralTexts(10, LiteralObjetivoOct, LiteralAlcanceOct, LiteralAlcancePorcentajeOct, LiteralPromedioDiarioOct, LiteralProyeccionOct, LiteralAlcanceProyectadoOct,
                     LiteralEntrevistadoOct, LiteralPasoOct, LiteralNoPasoOct, LiteralContratadoOct, LiteralCapacitadoOct, LiteralNoCapacitadoOct);

        LiteralTexts(11, LiteralObjetivoNov, LiteralAlcanceNov, LiteralAlcancePorcentajeNov, LiteralPromedioDiarioNov, LiteralProyeccionNov, LiteralAlcanceProyectadoNov,
                     LiteralEntrevistadoNov, LiteralPasoNov, LiteralNoPasoNov, LiteralContratadoNov, LiteralCapacitadoNov, LiteralNoCapacitadoNov);

        LiteralTexts(12, LiteralObjetivoDic, LiteralAlcanceDic, LiteralAlcancePorcentajeDic, LiteralPromedioDiarioDic, LiteralProyeccionDic, LiteralAlcanceProyectadoDic,
                     LiteralEntrevistadoDic, LiteralPasoDic, LiteralNoPasoDic, LiteralContratadoDic, LiteralCapacitadoDic, LiteralNoCapacitadoDic);

    }

    public void LiteralTexts(int month, 
                             Literal LiteralObjetivo, Literal LiteralAlcance, Literal LiteralAlcancePorcentaje,
                             Literal LiteralPromedioDiario, Literal LiteralProyeccion, Literal LiteralAlcanceProyectado,
                             Literal LiteralEntrevistado, Literal LiteralPaso, Literal LiteralNoPaso,
                             Literal LiteralContratado, Literal LiteralCapacitado, Literal LiteralNoCapacitado)
    {
        UserQ user = User();
        int year = Year();
        List<Interview> ListInterviews = db.Interviews.ToList();
        DateTime startDate = new DateTime(year, month, 1);
        DateTime startEnd = startDate.AddMonths(1);
        ListInterviews = ListInterviews.FindAll(delegate(Interview i)
        {
            return i.RegisterDate >= startDate && i.RegisterDate < startEnd;
        });

        //Lider
        if (user.RoleId == 2)
        {
            ListInterviews = ListInterviews.FindAll(delegate(Interview i)
            {
                return i.LiderId == user.Id;
            });
        }

        //Coordinador
        if (user.RoleId == 3)
        {
            ListInterviews = ListInterviews.FindAll(delegate(Interview i)
            {
                return i.CoordinatorId == user.Id;
            });
        }
        int dayUtils = DayUtils(month, year, true);

        int objective = int.Parse(LiteralObjetivo.Text);
        int alcance = ListInterviews.Count;
        double alcancePorcentaje = (objective == 0) ? 0 : (alcance * 1.0 / objective * 1.0);
        int promedioDiario = (dayUtils==0)?0:(alcance / dayUtils);
        int proyeccion = promedioDiario * DayUtils(month, year, false);
        double alcanceProyectado = (objective == 0) ? 0 : (proyeccion * 1.0 / objective * 1.0);
        int entrevistado = 0;
        int paso = 0;
        int noPaso = 0;
        int contratado = 0;
        int capacitado = 0;
        int noCapacitado = 0;

        foreach (Interview i in ListInterviews)
        {
            if(i.Status.Equals("1"))
            {
                paso++; entrevistado++;
            }
            else
            {
                noPaso++; entrevistado++;
            }
            if (i.Hired.HasValue)
            {
                if (i.Hired.Value)
                {
                    contratado++;
                }
            }
            if (i.Training.HasValue)
            {
                if (i.Training.Value)
                {
                    capacitado++;
                }
                else
                {
                    noCapacitado++;
                }
            }
        }

        LiteralAlcance.Text = alcance.ToString();
        LiteralAlcancePorcentaje.Text = String.Format("{0:p}", alcancePorcentaje);
        LiteralPromedioDiario.Text = promedioDiario.ToString();
        LiteralProyeccion.Text = proyeccion.ToString();
        LiteralAlcanceProyectado.Text = String.Format("{0:p}", alcanceProyectado);
        LiteralEntrevistado.Text = entrevistado.ToString();
        LiteralPaso.Text = paso.ToString();
        LiteralNoPaso.Text = noPaso.ToString();
        LiteralContratado.Text = contratado.ToString();
        LiteralCapacitado.Text = capacitado.ToString();
        LiteralNoCapacitado.Text = noCapacitado.ToString();

    }

    public int DayUtils(int month, int year, bool isPartial)
    {
        int numDays = 0;

        DateTime dateStart = new DateTime(year, month,1);
        DateTime dateEnd = dateStart.AddMonths(1);
        
        if (isPartial)
        {
            DateTime dateToday = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
            dateToday = dateToday.AddDays(1);
            while (dateStart < dateEnd && dateStart < dateToday)
            {
                if (dateStart.DayOfWeek != DayOfWeek.Saturday && dateStart.DayOfWeek != DayOfWeek.Sunday)
                {
                    numDays++;
                }
                dateStart = dateStart.AddDays(1);
            }
        }
        else
        {
            while (dateStart < dateEnd)
            {
                if (dateStart.DayOfWeek != DayOfWeek.Saturday && dateStart.DayOfWeek != DayOfWeek.Sunday)
                {
                    numDays++;
                }
                dateStart = dateStart.AddDays(1);
            }
        }

        return numDays;
    }

    protected void ButtonUpdateObjective_Click(object sender, EventArgs e)
    {
        int year = Year();
        int userId = User().Id;
        SetObjectiveMonth(1, year, userId, TextBoxObjetivoEne);
        SetObjectiveMonth(2, year, userId, TextBoxObjetivoFeb);
        SetObjectiveMonth(3, year, userId, TextBoxObjetivoMar);
        SetObjectiveMonth(4, year, userId, TextBoxObjetivoAbr);
        SetObjectiveMonth(5, year, userId, TextBoxObjetivoMay);
        SetObjectiveMonth(6, year, userId, TextBoxObjetivoJun);
        SetObjectiveMonth(7, year, userId, TextBoxObjetivoJul);
        SetObjectiveMonth(8, year, userId, TextBoxObjetivoAgo);
        SetObjectiveMonth(9, year, userId, TextBoxObjetivoSep);
        SetObjectiveMonth(10, year, userId, TextBoxObjetivoOct);
        SetObjectiveMonth(11, year, userId, TextBoxObjetivoNov);
        SetObjectiveMonth(12, year, userId, TextBoxObjetivoDic);
    
    }

    public void SetObjectiveMonth(int month, int year, int userId, TextBox TextBoxObjetivo)
    {
        SummaryQ summaryMonth = base.db.SummaryQs.FirstOrDefault(delegate(SummaryQ s) { return s.Month == month && s.Year == year && s.UserId == userId; });

        if (summaryMonth != null)
        {
            summaryMonth.Objective = String.IsNullOrEmpty(TextBoxObjetivo.Text) ? 0 : int.Parse(TextBoxObjetivo.Text);
            base.db.SubmitChanges();
        }
        else
        {
            SummaryQ summaryMonthNew = new SummaryQ();
            int Id = (db.SummaryQs.Count() > 0)? ((from u in db.SummaryQs select u.SummaryId).Max() + 1) : 1;
            
            summaryMonthNew.SummaryId = Id;
            summaryMonthNew.Month = month;
            summaryMonthNew.Year = year;
            summaryMonthNew.UserId = userId;
            summaryMonthNew.Objective = String.IsNullOrEmpty(TextBoxObjetivo.Text) ? 0 : int.Parse(TextBoxObjetivo.Text);
            base.db.SummaryQs.InsertOnSubmit(summaryMonthNew);
            base.db.SubmitChanges();

        }
    }



    public void LoadObjective()
    {
        int year = Year();
        int userId = User().Id;
        LoadObjectiveMonth( 1, year, userId, LiteralObjetivoEne, TextBoxObjetivoEne);
        LoadObjectiveMonth( 2, year, userId, LiteralObjetivoFeb, TextBoxObjetivoFeb);
        LoadObjectiveMonth( 3, year, userId, LiteralObjetivoMar, TextBoxObjetivoMar);
        LoadObjectiveMonth( 4, year, userId, LiteralObjetivoAbr, TextBoxObjetivoAbr);
        LoadObjectiveMonth( 5, year, userId, LiteralObjetivoMay, TextBoxObjetivoMay);
        LoadObjectiveMonth( 6, year, userId, LiteralObjetivoJun, TextBoxObjetivoJun);
        LoadObjectiveMonth( 7, year, userId, LiteralObjetivoJul, TextBoxObjetivoJul);
        LoadObjectiveMonth( 8, year, userId, LiteralObjetivoAgo, TextBoxObjetivoAgo);
        LoadObjectiveMonth( 9, year, userId, LiteralObjetivoSep, TextBoxObjetivoSep);
        LoadObjectiveMonth(10, year, userId, LiteralObjetivoOct, TextBoxObjetivoOct);
        LoadObjectiveMonth(11, year, userId, LiteralObjetivoNov, TextBoxObjetivoNov);
        LoadObjectiveMonth(12, year, userId, LiteralObjetivoDic, TextBoxObjetivoDic);
    }

    public void LoadObjectiveMonth(int month, int year, int userId, Literal LiteralObjetivo, TextBox TextBoxObjetivo)
    {
        SummaryQ summaryMonth = base.db.SummaryQs.FirstOrDefault(delegate(SummaryQ s) { return s.Month == month && s.Year == year && s.UserId == userId; });
        LiteralObjetivo.Text = (summaryMonth == null) ? "0" : summaryMonth.Objective.ToString();
        TextBoxObjetivo.Text = LiteralObjetivo.Text;

        LiteralObjetivo.Visible = (base.UserSystem.RoleId != 1);
        TextBoxObjetivo.Visible = (base.UserSystem.RoleId == 1);
    }

}
